package com.k.jdbc.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by 170623910 on 2021/8/23.
 */
public class ResultSetMapping {
    public static <T> List<T> resultToList(ResultSet resultSet, Class<T> clazz) {
        List<T> list = new ArrayList<>();
        try {
            T t = clazz.getConstructor().newInstance();
            ResultSetMetaData metaData = resultSet.getMetaData();
            while (resultSet.next()) {
                for (int i = 0; i < metaData.getColumnCount(); i++) {
                    String columnName = metaData.getColumnLabel(i + 1);

                    String fName = columnNameToFieldName(columnName);
                    //因为列的名字和我们EMP中的属性名是一样的&#xff0c;所以通过列的名字获得其EMP中属性
                    Field field = clazz.getDeclaredField(fName.toLowerCase());
                    //因为属性是私有的&#xff0c;所有获得其对应的set 方法。set+属性名首字母大写+其他小写
                    String setName = "set" + fName.toUpperCase().substring(0, 1) + fName.substring(1).toLowerCase();
                    //因为属性的类型和set方法的参数类型一致&#xff0c;所以可以获得set方法
                    Method setMethod = clazz.getMethod(setName, field.getType());
                    //执行set方法&#xff0c;把resultSet中的值传入emp中&#xff0c;  再继续循环传值
                    setMethod.invoke(t, resultSet.getObject(fName));
                }
                //把赋值后的对象 加入到list集合中
                list.add(t);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 返回list
        return list;
    }

    /**
     * 数据库 字段名 转 类属性名
     * @param columnName columnName
     * @return fieldName
     */
    private static String columnNameToFieldName(String columnName) {
        // tb_user ->tbUser
        // guava
        String fieldName = columnName;
        // fieldName = CaseFormat.LOWER_UNDERSCORE.converterTo(CaseFormat.LOWER_CAMEL).convert(columnName);
        return fieldName;
    }
}
